package com.jt.provider.controller;

import com.sun.org.apache.xerces.internal.xs.LSInputList;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@RefreshScope
@RestController
public class ProviderCacheController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/provider/cache01")
    public String doUseLocalCache01() {
        return "useLocalCache'value is   " + useLocalCache;
    }

    //目标：定义1个cache,我们要将从数据库取到数据存储cache中,下次取数据从cache取.
    //1)要保证数据的正确(线程安全)
    //2)要保证效率.
    private List<String> cache = new CopyOnWriteArrayList<>();

    @RequestMapping("/provider/cache02")
    public List<String> doUseLocalCache02() {
        Object o = new Object();
        //1.配置中心useLocalCache值为false,则直接从数据库取
        if (!useLocalCache) {
            System.out.println("本地缓存没有打开,查询数据库");
            return Arrays.asList("A", "B", "C");
        }//假设这是从数据库取的数据
            //2.useLocalCache开启了(值为true)则执行如下步骤
            //2.1从cache取数据 假如有则直接返回.
            //2.2 cache中没有数据则从数据库取数据,并将数据存储到cache中 返回数据
            if (cache.isEmpty()) {
                synchronized (this) {
                    if (cache.isEmpty()) {
                        System.out.println("本地缓存开关打开了,但是缓存没有数据,查数据库");
                        //查数据库(模拟)
                        List<String> list = Arrays.asList("A", "B", "C");
                        cache.addAll(list);
                    }
                }
            }
            return cache;
    }
}